package com.lp.multi.lock;

import java.util.concurrent.TimeUnit;

/**
 * @author: lp
 * @create: 2021-06-26 21:05
 * @description: 八锁现象2
 * 主线程sleep足够时间(1秒)，A线程先拿到phone对象的锁,A线程获取锁后sleep时间超过主线程（4秒）
 * 执行结果:
 * A:send msg
 * B:call msg
 * 原因:主线程sleep期间，B线程还未创建，A线程先运行拿到了锁。A线程sleep 4秒完成前(抱着phone对象锁不释放)，虽然B线程已经进入准备运行
 * 状态，但是在A不释放锁前，无法获取锁。
 *
 *
 *
 */
public class CLock {
    public static void main(String[] args) {
        Phone2 phone = new Phone2();

        new Thread(()->{
            phone.sendMsg();
        },"A").start();
        //极端一点，可以把sleep放在线程线程B获取phone锁前sleep
        try {
            //主线程sleep,B线程未获取锁前，确保A线程获取了锁
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
//            try {
//                TimeUnit.SECONDS.sleep(1);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
            phone.call();
        },"B").start();
    }
}

class Phone2{

    //synchronized修饰普通方法，锁定的是方法的调用对象,谁先调用，谁先拿到锁
    public synchronized void sendMsg(){
        try {
            //sleep不会释放锁，时间到后，代码继续执行
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":"+"send msg");
    }

    public synchronized void call(){
        System.out.println(Thread.currentThread().getName()+":"+"call msg");
    }



}
